package 字符串;

import java.util.HashMap;
import java.util.Map;

/**
 * 290. 单词规律
 * 给定一种规律 pattern 和一个字符串 s ，判断 s 是否遵循相同的规律。
 * 这里的 遵循 指完全匹配，例如， pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。
 *
 * 思路：既然是映射关系，优先构建一个Hash表，然后判断对应的String字符串中的元素是否匹配
 * 1： 创建一个HashMap, 并将String根据空格分隔为数组;
 * 2:  判断pattern 的长度是否与String数组的长度相等，如果不相等，直接返回false;
 * 3： 然后遍历pattern，将pattern中的元素作为key，String数组中对应下标的元素作为Value
 *   如果map中的key不存在，则添加，如果map中的key存在，则比较对应的value是否相等，如果不相等，则返回false;
 */
public class L_290 {
    public boolean wordPattern(String pattern, String s) {
        // 1： 分割数组
        Map<Character,String> map =new HashMap<>();
        String[] sItem = s.split(" ");
        // 2: 判断长度是否相等
        if(sItem.length != pattern.length()){
            return false;
        }
        //3:遍历数组
        for (int i = 0; i < pattern.length(); i++) {
            // 如果不包含，则添加
            if(!map.containsKey(pattern.charAt(i))){
                // 如果Map中已经存在了对应的value，则返回false，防止"abba" "dog dog dog dog"的情况
                if(map.containsValue(sItem[i])){
                    return false;
                }
                map.put(pattern.charAt(i),sItem[i]);
            }else {
                if(!map.get(pattern.charAt(i)).equals(sItem[i])){
                    return false;
                }
            }
        }

        return true;
    }
}
